package instalador;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Extractor implements Runnable {

    private String MANIFEST;
    private JFrame padre;
    private int porcentaje;

    public Extractor(JFrame padre) {
        MANIFEST = "META-INF/MANIFEST.MF";
        this.padre = padre;
    }

    public void extraer() {
        try {

            boolean corrupto = true;
            File ruta = new File(".");
            File archivosServidor = new File(ruta.getCanonicalPath() + VariablesDeEntorno.SEPARADOR + "lib" + VariablesDeEntorno.SEPARADOR + "ArchivosServidor.jar");
            File archivosCliente = new File(ruta.getCanonicalPath() + VariablesDeEntorno.SEPARADOR + "lib" + VariablesDeEntorno.SEPARADOR + "ArchivosCliente.jar");
            if (VariablesDeEntorno.TIPOINSTALACION.equals("CLIENTE") && archivosCliente.exists()) {
                corrupto = false;
                extraerTodo(archivosCliente);
            }
            if (VariablesDeEntorno.TIPOINSTALACION.equals("SERVIDOR") && archivosServidor.exists()) {
                corrupto = false;
                extraerTodo(archivosServidor);
            }
            if (corrupto) {
                JOptionPane.showMessageDialog(null, "Por favor verifique los archivos de Instalacion.\n Vuelva a intentar en otra oportunidad.", "ERROR en Dependencias.", JOptionPane.ERROR_MESSAGE);
                System.exit(0);
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void extraerTodo(File archivos) {
        File archivoActual = archivos;
        File directorioSalida = new File(VariablesDeEntorno.RUTA);

        byte[] buf = new byte[1024];


        ZipFile archivo = null;
        FileOutputStream salida = null;
        InputStream entrada = null;

        try {
            archivo = new ZipFile(archivoActual);

            int tamanio = archivo.size();
            int extraidos = 0;
            Enumeration entradas = archivo.entries();

            for (int i = 0; i < tamanio; i++) {
                ZipEntry entradaArchivo = (ZipEntry) entradas.nextElement();
                if (entradaArchivo.isDirectory()) {
                    continue;
                }

                String nombreArchivo = entradaArchivo.getName();
                if (MANIFEST.equals(nombreArchivo.toUpperCase())) {
                    continue;
                }

                extraidos++;
                porcentaje = ((i + 1) * 100) / tamanio;
                VentanaInstalador.jProgressBar.setValue(porcentaje);
                VentanaInstalador.jProgressBar.setString(String.valueOf(porcentaje) + " %");
                VentanaInstalador.jLabelEvento.setText("Copiando Archivos");
                entrada = archivo.getInputStream(entradaArchivo);

                File archivoSalida = new File(directorioSalida, nombreArchivo);


                File parent = new File(archivoSalida.getParent());
                if (parent != null && !parent.exists()) {
                    parent.mkdirs();
                }

                salida = new FileOutputStream(archivoSalida);

                while (true) {
                    int leyendo = entrada.read(buf, 0, buf.length);
                    if (leyendo <= 0) {
                        break;
                    }
                    salida.write(buf, 0, leyendo);
                }
                salida.close();
            }
            archivo.close();
            extraidos++;
            String mensaje = "\n    Se Copiaron " + extraidos + " archivo" + ((extraidos > 1) ? "s" : "") +
                    "\n    En el Directorio " + VariablesDeEntorno.RUTA;
            VentanaInstalador.jTextPane5.setText(VentanaInstalador.jTextPane5.getText() + mensaje);

        } catch (Exception e) {
            System.out.println(e);
            if (archivo != null) {
                try {
                    archivo.close();
                } catch (IOException ioe) {
                    ;
                }
            }
            if (salida != null) {
                try {
                    salida.close();
                } catch (IOException ioe) {
                    ;
                }
            }
            if (entrada != null) {
                try {
                    entrada.close();
                } catch (IOException ioe) {
                    ;
                }
            }
        }
    }

    public void run() {
        extraer();
        CrearXML xml = new CrearXML(padre);
        Thread hilo = new Thread(xml);
        hilo.start();
    }
}
